#!/bin/sh
#
# Copyright (C) 2000-2025 Kern Sibbald
# License: BSD 2-Clause; see file LICENSE-FOSS
#
# TODO:
#  - test bextract
#  - with strip path 
#
# Run a accurate backup of the Bacula build directory
#   then restore it.
#

TestName="accurate-test"
JobName=backup
. scripts/functions
$rscripts/cleanup

copy_test_confs
cp -f $rscripts/bacula-dir.conf.accurate $conf/bacula-dir.conf
#sed s/all,/all,saved,/ $conf/bacula-fd.conf > tmp/1
#cp tmp/1 $conf/bacula-fd.conf

change_jobname BackupClient1 $JobName

p() {
   echo "##############################################" >> ${cwd}/tmp/log1.out
   echo "$*" >> ${cwd}/tmp/log1.out
   echo "##############################################" >> ${cwd}/tmp/log2.out
   echo "$*" >> ${cwd}/tmp/log2.out
   if test "$debug" -eq 1 ; then
      echo "##############################################"
      echo "$*"
   fi
}

# cleanup
rm -rf ${cwd}/build/accurate.new
rm -rf ${cwd}/build/accurate


# add extra files
mkdir -p ${cwd}/build/accurate
mkdir -p ${cwd}/build/accurate/dirtest
echo "test test" > ${cwd}/build/accurate/dirtest/hello
echo "test test" > ${cwd}/build/accurate/xxx
echo "test test" > ${cwd}/build/accurate/yyy
echo "test test" > ${cwd}/build/accurate/zzz
echo "test test" > ${cwd}/build/accurate/zzzzzz
echo "test test" > ${cwd}/build/accurate/xxxxxx
echo "test test" > ${cwd}/build/accurate/yyyyyy
echo "test test" > ${cwd}/build/accurate/xxxxxxxxx
echo "test test" > ${cwd}/build/accurate/yyyyyyyyy
echo "test test" > ${cwd}/build/accurate/zzzzzzzzz
echo ${cwd}/build > ${cwd}/tmp/file-list

start_test

cat <<END_OF_DATA >${cwd}/tmp/bconcmds
@$out /dev/null
messages
label volume=TestVolume001 storage=File pool=Default
messages
END_OF_DATA

run_bacula

cat <<END_OF_DATA >${cwd}/tmp/bconcmds
@$out ${cwd}/tmp/log1.out
run job=$JobName yes
wait
messages
@# 
@# now do a restore
@#
@$out ${cwd}/tmp/log2.out  
setdebug level=10 storage=File trace=1
restore fileset=FS_TESTJOB where=${cwd}/tmp/bacula-restores select all done
yes
wait
messages
quit
END_OF_DATA

################################################################
p First :  We just run full and restore to compare if all is ok
################################################################

run_bconsole
check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff

rm -rf ${cwd}/tmp/bacula-restores

################################################################
p Now do a second backup after making few changes
################################################################
rm ${cwd}/build/accurate/xxx  # delete a file
rm ${cwd}/build/accurate/dirtest/hello

run_bconsole
check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff
check_files_written ${cwd}/tmp/log1.out 4

rm -rf ${cwd}/tmp/bacula-restores

################################################################
p Now do a third backup after making few changes
################################################################
rm ${cwd}/build/accurate/yyyyyy  # delete a file
rmdir ${cwd}/build/accurate/dirtest

run_bconsole
check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff
check_files_written ${cwd}/tmp/log1.out 3

rm -rf ${cwd}/tmp/bacula-restores

################################################################
p Now do a 4 backup after making few changes
################################################################
rm ${cwd}/build/accurate/zzzzzz  # delete a file

run_bconsole
check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff
check_files_written ${cwd}/tmp/log1.out 2

rm -rf ${cwd}/tmp/bacula-restores

################################################################
p Now do a 5 backup after making few changes
################################################################
rm ${cwd}/build/accurate/zzzzzzzzz

run_bconsole
check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff
check_files_written ${cwd}/tmp/log1.out 2

rm -rf ${cwd}/tmp/bacula-restores

################################################################
p Now do a backup after making few changes
################################################################
touch ${cwd}/build/accurate/aaaaaa

run_bconsole
check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff
check_files_written ${cwd}/tmp/log1.out 2

rm -rf ${cwd}/tmp/bacula-restores

################################################################
p Check with bls
################################################################

#
# When FORCE_DEDUP is set, bls cannot work when the SD is running so skip this test
if test x$FORCE_DEDUP != xyes; then
   $bin/bls -c $conf/bacula-sd.conf -V 'TestVolume001' FileStorage > $tmp/bls.out
   grep -- '----' $tmp/bls.out | grep xxx > /dev/null
   if [ $? != 0 ] ; then
      print_debug "ERROR: Could not find deleted files in $tmp/bls.out"
      cat $tmp/bls.out
      bstat=2
   fi
fi

################################################################
p Now do a backup after making few changes
################################################################

# some files will have disappear, others have their old mtime/ctime
mv ${cwd}/build/accurate ${cwd}/build/accurate.new

run_bconsole
check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff

rm -rf ${cwd}/tmp/bacula-restores

################################################################
p Now do an other test in differential mode
################################################################

cat <<END_OF_DATA >${cwd}/tmp/bconcmds
@$out ${cwd}/tmp/log1.out
run job=$JobName level=differential yes
wait
messages
@# 
@# now do a restore
@#
@$out ${cwd}/tmp/log2.out  
setdebug level=10 storage=File trace=1
restore fileset=FS_TESTJOB where=${cwd}/tmp/bacula-restores select all done
yes
wait
messages
quit
END_OF_DATA

run_bconsole
check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff

rm -rf ${cwd}/tmp/bacula-restores

################################################################
p Now do an other test in differential mode + incremental
################################################################

# make some changes
mv ${cwd}/build/accurate.new ${cwd}/build/accurate

cat <<END_OF_DATA >${cwd}/tmp/bconcmds
@$out ${cwd}/tmp/log1.out
run job=$JobName yes
wait
messages
@# 
@# now do a restore
@#
@$out ${cwd}/tmp/log2.out  
setdebug level=10 storage=File trace=1
restore fileset=FS_TESTJOB where=${cwd}/tmp/bacula-restores select all done
yes
wait
messages
quit
END_OF_DATA

run_bconsole
check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff

rm -rf ${cwd}/tmp/bacula-restores

################################################################
p Now do a backup after making few changes
################################################################
rm ${cwd}/build/accurate/aaaaaa
touch ${cwd}/build/accurate/bbbbbb

run_bconsole
check_for_zombie_jobs storage=File
check_files_written ${cwd}/tmp/log1.out 3

check_two_logs
check_restore_diff

################################################################
p Now do a backup after making few changes
################################################################
mv ${cwd}/tmp/bacula-restores ${cwd}/build/accurate/

run_bconsole
check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff

rm -rf ${cwd}/tmp/bacula-restores

stop_bacula

################################################################
p Check with bscan -- this takes some time
################################################################

cd $cwd/bin
  ./drop_bacula_tables      >/dev/null 2>&1
  ./make_bacula_tables      >/dev/null 2>&1
  ./grant_bacula_privileges >/dev/null 2>&1
cd $cwd

echo "volume=TestVolume001" >tmp/bscan.bsr

bscan_libdbi

# If the database has a password pass it to bscan
if test "x${db_password}" = "x"; then
  PASSWD=
else
  PASSWD="-P ${db_password}"
fi

$bin/bscan -c $conf/bacula-sd.conf $BSCANLIBDBI $PASSWD -n "$db_name" -u "$db_user" -m -s -b $tmp/bscan.bsr FileStorage 2>&1 > $tmp/bscan.log

cat <<END_OF_DATA >${cwd}/tmp/bconcmds
@$out ${cwd}/tmp/log1.out
messages
@# 
@# now do a restore after bscan
@#
@$out ${cwd}/tmp/log2.out  
setdebug level=10 storage=File trace=1
restore fileset=FS_TESTJOB where=${cwd}/tmp/bacula-restores select all done
yes
wait
messages
quit
END_OF_DATA

# run bacula with just the restore job
run_bacula

check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff

rm -rf ${cwd}/tmp/bacula-restores  ${cwd}/build/accurate/bacula-restores

################################################################
p Now do a test with other attributes: owner, gid, rights
################################################################

cat <<END_OF_DATA >${cwd}/tmp/bconcmds
@$out ${cwd}/tmp/log1.out
label volume=TestVolume002 storage=File pool=Default
run job=backup_advance yes
wait
messages
@# 
@# now do a restore
@#
@$out ${cwd}/tmp/log2.out  
setdebug level=10 storage=File trace=1
restore fileset=FS_TESTJOB_ADVANCE where=${cwd}/tmp/bacula-restores select all done
yes
wait
messages
quit
END_OF_DATA

run_bconsole
check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff

rm -rf ${cwd}/tmp/bacula-restores


################################################################
p Use the p option for verify
################################################################

chmod 400 ${cwd}/build/accurate/yyy

cat <<END_OF_DATA >${cwd}/tmp/bconcmds
@$out ${cwd}/tmp/log1.out
run job=backup_advance yes
wait
messages
@# 
@# now do a restore
@#
@$out ${cwd}/tmp/log2.out  
setdebug level=10 storage=File trace=1
restore fileset=FS_TESTJOB_ADVANCE where=${cwd}/tmp/bacula-restores select all done
yes
wait
messages
quit
END_OF_DATA

run_bconsole
check_for_zombie_jobs storage=File

check_two_logs
check_restore_diff
check_files_written ${cwd}/tmp/log1.out 1

rm -rf ${cwd}/tmp/bacula-restores

################################################################
p Test strippath option
################################################################

cat <<END_OF_DATA >${cwd}/tmp/bconcmds
@$out ${cwd}/tmp/log1.out
setdebug  level=1 client=$CLIENT trace=1
run job=backup fileset=FS_TESTJOB2 yes
wait
messages
@$out ${cwd}/tmp/log3.out
st dir
quit
END_OF_DATA

run_bconsole
check_for_zombie_jobs storage=File

# run incremental
rm -f ${cwd}/build/accurate/yyy
run_bconsole
check_for_zombie_jobs storage=File

jobid=`awk '/ Incr.+backup/ { jobid=$1 } END { print jobid }' ${cwd}/tmp/log3.out`

cat <<END_OF_DATA >${cwd}/tmp/bconcmds
@$out ${cwd}/tmp/log3.out
list files type=all jobid=$jobid
quit
END_OF_DATA

run_bconsole

grep yyy ${cwd}/tmp/log3.out > /dev/null
if [ $? != 0 ] ; then
    print_debug "ERROR: Can't find yyy file into 'list files' output (${cwd}/tmp/log3.out)"
    dstat=2
fi

grep zzz ${cwd}/tmp/log3.out > /dev/null
if [ $? = 0 ] ; then
    print_debug "ERROR: Should not find zzz file into 'list files' output (${cwd}/tmp/log3.out)"
    dstat=2
fi

stop_bacula
end_test
